﻿using BLLConDes;
using ConDes.Modelos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace ConDes.Controllers
{
    public class TiendaController : Controller
    {
        public List<MiCompraItemModel> Carrito
        {
            get
            {
                if (Session["Carrito"] == null)
                    Session["Carrito"] = new List<MiCompraItemModel>();

                return Session["Carrito"] as List<MiCompraItemModel>;
            }
        }


        public ActionResult Index(int idCategoria, int? idSubCategoria)
        {
            TiendaModel model = new TiendaModel();
            CD_Categoria categoria = new BLLCategoria().TraerCategoria(idCategoria);

            model.IdCategoria = categoria.IdCategoria;
            model.Nombre = categoria.Nombre;
            model.SubCategorias = new Dictionary<int, string>();

            if (idSubCategoria == null)
                idSubCategoria = categoria.CD_Categorias.FirstOrDefault().IdCategoria;

            model.IdSubCategoria = idSubCategoria.Value;
            model.NombreSubCategoria = categoria.CD_Categorias.Where(c => c.IdCategoria == idSubCategoria).First().Nombre;

            foreach (CD_Categoria item in categoria.CD_Categorias.OrderBy(c => c.Nombre).ToList())
                model.SubCategorias.Add(item.IdCategoria, item.Nombre);

            model.Productos = Convertir(new BLLProducto().TraerProductos(idSubCategoria.Value));

            return View("Index", model);
        }

        private List<ProductoModel> Convertir(List<CD_Producto> productos)
        {
            return (from p in productos
                    orderby p.IdProducto descending
                    select new ProductoModel
                    {
                        Foto = p.CD_ProductoFotos.First().Archivo,
                        IdProducto = p.IdProducto,
                        Nombre = p.Nombre,
                        Precio = p.Precio.Value,
                        Cuota12 = p.Precio.Value / 12
                    }).ToList();
        }

        public ActionResult VerProducto(int idProducto)
        {
            BLLProducto bllProducto = new BLLProducto();
            CD_Producto producto = bllProducto.TraerProducto(idProducto);

            VerProductoModel model = new VerProductoModel();
            model.IdProducto = producto.IdProducto;
            model.Nombre = producto.Nombre;
            model.Precio = producto.Precio.Value;
            model.Cuota12 = producto.Precio.Value / 12;
            model.Descripcion = producto.Descripcion;

            model.IdCategoria = producto.CD_Categoria.CD_Categoria1.IdCategoria;
            model.Categoria = producto.CD_Categoria.CD_Categoria1.Nombre;
            model.IdSubCategoria = producto.CD_Categoria.IdCategoria;
            model.SubCategoria = producto.CD_Categoria.Nombre;

            model.Fotos = bllProducto.TraerFotos(idProducto);

            return View("Producto", model);
        }

        public ActionResult Pagar()
        {
            BLLProvincia bllProvincia = new BLLProvincia();
            CarritoModel model = new CarritoModel();
            model.Items = Carrito;
            model.Provincias = bllProvincia.TraerProvincias();

            model.Meses = new List<string>();
            for (int i = 1; i <= 12; i++)
                model.Meses.Add(((Meses) i).ToString());

            model.Años = new List<int>();
            for (int i = DateTime.Now.Year; i <= (DateTime.Now.Year + 10); i++)
                model.Años.Add(i);

            BLLEmpresa bllEmpresa = new BLLEmpresa(bllProvincia.Contexto);
            model.Empresas = bllEmpresa.TraerEmpresas();

            return View("Pagar", model);
        }

        public JsonResult ObtenerCantidadMiCompra()
        {
            return Json(new { Cantidad = Carrito.Count }, JsonRequestBehavior.AllowGet);
        }

        public void AgregarProducto(int idProducto)
        {
            if (Carrito.Where(p => p.IdProducto == idProducto).Count() > 0)
                return;

            BLLProducto bllProducto = new BLLProducto();
            CD_Producto producto = bllProducto.TraerProducto(idProducto);
            MiCompraItemModel item = new MiCompraItemModel();
            item.Cantidad = 1;
            item.IdProducto = producto.IdProducto;
            item.Imagen = bllProducto.TraerFotos(idProducto).First();
            item.Nombre = producto.Nombre;
            item.Precio = producto.Precio.Value;
            Carrito.Add(item);
        }

        public void RemoverProducto(int idProducto)
        {
            Carrito.Remove(Carrito.Where(c => c.IdProducto == idProducto).First());
        }

        public JsonResult Comprar(ComprarModel model)
        {
            BLLCompra bllCompra = new BLLCompra();

            CD_Compra compra = new CD_Compra();
            compra.Año = model.Ano;
            compra.CD_Empresa = new BLLEmpresa(bllCompra.Contexto).TraerEmpresa(model.IdEmpresa);
            compra.CD_Provincia = new BLLProvincia(bllCompra.Contexto).Traer(model.IdProvincia);
            compra.Codigo = model.Codigo;
            compra.Domicilio = model.Domicilio;
            compra.Localidad = model.Localidad;
            compra.Email = model.Email;
            compra.Mes = model.Mes;
            compra.Tarjeta = model.Tarjeta;
            compra.Telefono = model.Telefono;
            compra.Nombre = model.Nombre;

            bllCompra.RegistrarCompra(compra);
            bllCompra.GuardarCambios();

            return Json(new { Resultado = "Ha ocurrido un error y no pudo realizarse la compra. Por favor revise los datos ó intente nuevamente más tarde" }, JsonRequestBehavior.AllowGet);
        }

        public ActionResult Buscar(string parametro)
        {
            BuscarModel model = new BuscarModel();
            model.Productos = Convertir(new BLLProducto().BuscarProductos(parametro));

            return View("Buscar", model);
        }
    }
}
